﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Diagnostics;
//Librerias Arquitectura
using Com.Binaria.Core;
using Com.Binaria.Core.Base;
using Com.Binaria.Core.Dto;
using Com.Binaria.Core.Util;
using Com.Binaria.Core.Datos;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core.Enumeracion;
//Librerias Proyecto
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.DAO;

namespace Com.Binaria.SISCOB.Dom
{
/// <summary>
///	clase de sucursal dom
/// </summary>
    public partial class EgresoDom : IEgresoDom
{
       
        #region metodos publicos

	
	
    /// <summary>
    /// metodo que permite registrar elementos de tipo sucursal en el sistema
    /// </summary>
    /// <param name="p_Contexto">informacion del contexto</param>
    /// <param name="p_Sucursal">sucursal a registrar (insertar, actualizar o eliminar)</param>
    /// <param name="p_Accion">Accion a realizar</param>
        public EgresoDTO ProbarRegistrar(ContextoDTO p_Contexto, DocumentoTransaccionDTO p_DocTranDTO)
        {
        //Prefijo del Metodo
        const String MPREFIX = " [ProbarRegistrar]";
        //Resultado accion insertar
        List<EgresoDTO> listEgresoResultDTO = null;
        List<DocumentoTransaccionDTO> listDocTranDTO = null;
        long tot = 0;

 

        try
        {
            //Registro log de inicio del proceso
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio + p_DocTranDTO.NmrDocumento + "***");

            //Valida que exista informacion en el objeto
            AssertNull.notNullOrEmpty(p_DocTranDTO);

            listDocTranDTO = iDocumentoTransaccionDom.BuscarByEgreso(p_Contexto, new DocumentoTransaccionDTO() { NmrDocumento = p_DocTranDTO.NmrDocumento, IdCuentaCorriente = p_DocTranDTO.IdCuentaCorriente });
            listDocTranDTO = listDocTranDTO.Where(dt => dt.IdIngreso==null && dt.Monto == p_DocTranDTO.Monto).ToList();
            if (listDocTranDTO.Count == 0)
            {

                listEgresoResultDTO = RegistrarEgreso(p_Contexto, new List<EgresoDTO>() { p_DocTranDTO.Egreso }, EnumRegistrarAccion.Agregar);
                p_DocTranDTO.IdEgreso = listEgresoResultDTO[0].Id;
                p_DocTranDTO.Egreso = listEgresoResultDTO[0];

                //conciliar
                if (!p_DocTranDTO.Egreso.Estado.Equals("GI"))
                {
                    iDocumentoTransaccionDom.Conciliar(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO });
                }

                listDocTranDTO = iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO }, EnumRegistrarAccion.Agregar);

                tot += (long)p_DocTranDTO.Monto;
            }
            else
            {
                EgresoDTO chDTO = BuscarEgresoPorId(p_Contexto,listDocTranDTO[0].IdEgreso);
                if (!chDTO.Estado.Equals("PA"))
                {

                    p_DocTranDTO.Egreso.Id = listDocTranDTO[0].IdEgreso;
                    p_DocTranDTO.Id = listDocTranDTO[0].Id;
                    listEgresoResultDTO = RegistrarEgreso(p_Contexto, new List<EgresoDTO>() { p_DocTranDTO.Egreso }, EnumRegistrarAccion.Modificar);

                    p_DocTranDTO.IdEgreso = listDocTranDTO[0].IdEgreso;
                    p_DocTranDTO.Glosa = listDocTranDTO[0].Glosa;

                    //conciliar
                    if (!p_DocTranDTO.Egreso.Estado.Equals("GI"))
                    {
                        iDocumentoTransaccionDom.Conciliar(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO });
                    }
                    
                    iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO }, EnumRegistrarAccion.Modificar);
                    listDocTranDTO.Add(p_DocTranDTO);


                }
                else
                {
                    p_DocTranDTO.Egreso = chDTO;
                }
            }

            //Console.WriteLine("Monto Egreso : " + tot);
            //Registro log de ejecucion el termino del metodo
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
        }
        catch (ManagerException me)
        {
            throw (me);
        }
        catch (ArquitecturaException ae)
        {
            throw (ae);
        }
        catch (Exception ex)
        {
            //Registro log de ejecucion con problemas
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
            //Genero error
            throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
        }
        return p_DocTranDTO.Egreso;
    }

        /// <summary>
        /// Metodo que permite buscar los elementos de tipo egreso existentes
        /// </summary>
        /// <param name="p_Contexto">informacion del contexto</param>
        /// <param name="p_Filtro">informacion de filtrado para realizar la busqueda</param>
        /// <returns>objeto contenedor de la informacion generada por la accion ejecutada</returns>	
        public List<EgresoDTO> BuscarEgresoFiltroPaginado(ContextoDTO p_Contexto, EgresoDTO p_Filtro)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [Buscar(ContextoDTO, EgresoDTO)]";
            //Crea lista de objetos de salida
            List<EgresoDTO> RespuestaBuscar = new List<EgresoDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion a insertar
                AssertNull.notNullOrEmpty(p_Filtro);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iEgresoDAO.FindPag(p_Filtro);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;
        }


        public List<EgresoDTO> BuscarEgresoCaducados(ContextoDTO p_Contexto, DateTime fchConsulta, Int16 diasMaximos)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [BuscarEgresoCaducados(ContextoDTO, EgresoDTO)]";
            //Crea lista de objetos de salida
            List<EgresoDTO> RespuestaBuscar = new List<EgresoDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iEgresoDAO.FindCaducados(fchConsulta, diasMaximos);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;
        }

    #endregion metodos publicos

	}//End class SucursalDom
}//End namespace





